import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import myML_functions as myML_functions
import tensorflow as tf
from keras import metrics
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, MaxPool2D, Dropout, BatchNormalization
from keras.utils import to_categorical
from keras.callbacks import ModelCheckpoint
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score, cross_validate, cross_val_predict
from sklearn.model_selection import KFold
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import make_scorer, f1_score, recall_score, precision_score, accuracy_score
print('defaults loaded')
labels = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker',
'Bag', 'boot']
train_data = pd.read_csv('./data/fashion-mnist_train.csv')
train_data = train_data
test_data = pd.read_csv('./data/fashion-mnist_test.csv')
test_data = test_data
train_features = np.array(train_data.iloc[:,1:])
train_features = np.reshape(train_features,(len(train_data),28,28,1))
train_target = to_categorical(train_data.iloc[:,0])
test_features = np.array(test_data.iloc[:,1:])
test_features = np.reshape(test_features,(len(test_data),28,28,1))
test_target = to_categorical(test_data.iloc[:,0])
img_rows = train_features.shape[1]
img_cols = train_features.shape[2]
print('reading done')
when metrics = 'accuracy', keras automatically chooses one of: binary accuracy, categorial accuracy or sparse categorial accuracy, depending on the types of inputs
gpu_fraction = 0.5
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
model = Sequential()
model.add(Conv2D(200, kernel_size=3, activation='relu', input_shape=(28, 28, 1),
padding='same', strides=2, dilation_rate=1))
#model.add(Dropout(rate=0.3))
model.add(BatchNormalization())
#model.add(MaxPool2D(2))
model.add(Conv2D(100, kernel_size=3, activation='relu', input_shape=(28, 28, 1),
padding='same', strides=2, dilation_rate=1))
#model.add(Dropout(rate=0.3))
model.add(BatchNormalization())
#model.add(MaxPool2D(2))
model.add(Conv2D(30, kernel_size=3, activation='relu', input_shape=(28, 28, 1),
padding='same', strides=2, dilation_rate=1))
#model.add(Dropout(rate=0.3))
model.add(BatchNormalization())
#model.add(MaxPool2D(2))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
checkpoint = ModelCheckpoint('cnn_weights.hdf5', monitor='val_loss', save_best_only=True)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
callbacks_list = [checkpoint]
model.fit(train_features, train_target, validation_split=0.2, epochs=15, batch_size=1000, verbose=2,
callbacks=callbacks_list)
model.load_weights('cnn_weights.hdf5')
score = model.evaluate(test_features, test_target, batch_size=10)
print(f"Evaluation test accuracy: {score[1]:0.2f}")
predictions = model.predict_classes(test_features)
test_decoded = np.argmax(test_target, axis=1)
accuracy = accuracy_score(test_decoded, predictions)
precision = precision_score(test_decoded, predictions, average='weighted')
recall = recall_score(test_decoded, predictions, average='weighted')
f1 = f1_score(test_decoded, predictions, average='weighted')
print(f"accuracy: {accuracy:0.3f}, precision: {precision:0.3f}, recall: {recall:0.3f}, f1: {f1:0.3f}\n")
print(classification_report(test_decoded, predictions, target_names=labels))
cm = confusion_matrix(test_decoded, predictions, labels=list(range(0,len(labels))))
myML_functions.print_cm(cm, labels=labels)
fig, ax = plt.subplots(figsize=(16,5))
grid = gridspec.GridSpec(2,8)
grid.update(wspace=0.3)
for idx in range(0,16):
subplot = plt.subplot(grid[idx])
subplot.imshow(test_features[idx, :, :, 0])
subplot.set_title(labels[predictions[idx]])
plt.show
def baseline_model():
model = Sequential()
model.add(Conv2D(10, kernel_size=3, activation='relu', input_shape=(28, 28, 1),
padding='same', strides=2, dilation_rate=1))
#model.add(Dropout(0.1))
model.add(BatchNormalization())
#model.add(MaxPool2D(2))
model.add(Conv2D(10, kernel_size=3, activation='relu',
padding='same', strides=2, dilation_rate=1))
#model.add(Dropout(0.1))
model.add(BatchNormalization())
#model.add(MaxPool2D(2))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
checkpoint = ModelCheckpoint('weights.hdf5', monitor='val_loss', save_best_only=True)
model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics=['accuracy'])
return model
estimator = KerasClassifier(build_fn=baseline_model, epochs=1, batch_size=5, verbose=True, validation_split=0.2)
seed = 1
kfold = KFold(n_splits=2, shuffle=True, random_state=seed)
results = cross_val_score(estimator, train_features, train_target, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
kfold = KFold(n_splits=2, shuffle=True, random_state=seed)
predictions = cross_val_predict(estimator, train_features, train_target, cv=kfold)
target_decoded = np.argmax(train_target, axis=1)
accuracy = accuracy_score(target_decoded, predictions)
precision = precision_score(target_decoded, predictions, average='weighted')
recall = recall_score(target_decoded, predictions, average='weighted')
f1 = f1_score(target_decoded, predictions, average='weighted')
print(f"accuracy: {accuracy:0.3f}, precision: {precision:0.3f}, recall: {recall:0.3f}, f1: {f1:0.3f}")
conv1 = model.layers[0]
weights1 = conv1.get_weights()
conv2 = model.layers[2]
weights2 = conv2.get_weights()
conv3 = model.layers[4]
weights3 = conv3.get_weights()
#first element is an array fo weights for the kernel
kernel1 = weights1[0]
kernel2 = weights2[0]
kernel3 = weights3[0]
print("kernel size, kernel size, Number of channels (colours), number of kernels in this layer")
print(weights1[0].shape)
# Pull out the first channel of the first kernel in the first layer
kernel1_1 = weights1[0][:,:,0, 0]
kernel2_1 = weights2[0][:,:,0, 0]
kernel3_1 = weights3[0][:,:,0, 0]
print(kernel1_1.shape)
plt.imshow(kernel1_1)
plt.imshow(kernel2_1)
def convolution(im, kernel):
result = np.zeros((im.shape[0], im.shape[1]))
for ii in range(im.shape[0] - kernel.shape[0]):
for jj in range(im.shape[1] - kernel.shape[1]):
result[ii, jj] = (im[ii:ii+kernel.shape[0], jj:jj+kernel.shape[1]] * kernel).sum()
return result
test_image = test_features[0, :, :, 0]
plt.imshow(test_image)
filtered_image = convolution(test_image,kernel3_1)
plt.imshow(filtered_image)
import keras.backend as K
def c1_c2_c3(y_true, y_pred):
# Count positive samples.
c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
c2 = K.sum(K.round(K.clip(y_pred, 0, 1)))
c3 = K.sum(K.round(K.clip(y_true, 0, 1)))
return(c1,c2,c3)
def f1_score(y_true, y_pred):
(c1,c2,c3) = c1_c2_c3(y_true, y_pred)
# If there are no true samples, fix the F1 score at 0.
if c3 == 0:
return 0
# How many selected items are relevant?
precision = c1 / c2
# How many relevant items are selected?
recall = c1 / c3
# Calculate f1_score
f1_score = 2 * (precision * recall) / (precision + recall)
return f1_score
def precision(y_true, y_pred):
(c1,c2,c3) = c1_c2_c3(y_true, y_pred)
return c1 / c2
def recall(y_true, y_pred):
(c1,c2,c3) = c1_c2_c3(y_true, y_pred)
# If there are no true samples, fix the F1 score at 0.
if c3 == 0:
return 0
return c1 / c3
def my_metric(y_true, y_pred):
g = tf.subtract(tf.expand_dims(y_pred, -1), y_pred)
g = tf.cast(g == 0.0, tf.float32) * 0.5 + tf.cast(g > 0.0, tf.float32)
f = tf.subtract(tf.expand_dims(y_true, -1), y_true) > 0.0
f = tf.matrix_band_part(tf.cast(f, tf.float32), -1, 0)
g = tf.reduce_sum(tf.multiply(g, f))
f = tf.reduce_sum(f)
return tf.where(tf.equal(g, 0), 0.0, g/f) #select